An input/output (I/O) subsystem connects some kind of computing device such as a server, desktop or notebook computer to one or more data storage devices on which data can be stored in a non-volatile manner. Examples of such data storage devices, i.e., computer readable/writable media, include:                optical devices such as CD or DVD disks,        rotating media such as disk drives of various types,        removable media such as magnetic tapes, and        non-volatile memory devices such as flash memory or solid state drives, among others.        
A storage subsystem is implemented by a controller which is accessed by the computing device either via some kind of local bus, or over a network which can itself be used for either storage, messaging, or a combination thereof. One type of conventional controller is a disk storage controller which connects a server to one or more rotating disk storage devices which may reside in either the same chassis as the server, or an external chassis. Another type of conventional controller is defined to interface with an optical medium storage device. Yet another type of conventional controller is defined to interface with a magnetic medium storage device. However, it should be understood that conventional controllers are not defined to control a mixture of different storage device types. Therefore, a conventional storage volume exposed to an attached host does not include a mixture of different storage media types.
Conventional storage subsystems avoid mixing different storage media types in a common storage volume because the performance attributes of the different storage media types can be substantially different, and because the access patterns supported by the different storage media types can be substantially different. For example, rotating disk drives can typically be accessed in a random manner, with the computing device requesting read or write access to any part of the disk any number of times. In contrast, an optical storage device can usually be read multiple times, but written only once, and even then in a sequential manner. In further contrast, magnetic storage media, e.g., tape, can usually be read or written a number of times but access must be sequential, i.e., the data blocks on the magnetic storage media should be read or written in a particular order.
One conventional approach for facilitating use of multiple storage media types in a coherent fashion is to use a caching technique. For example, systems may combine the use of rotating disk, magnetic, or optical storage devices. In such a configuration, it is possible for an application to save data to a rotating disk, making use of the rotating disk capability to read and write data blocks in any order at any time. Then, once a large amount of data has been copied to the rotating disk, the large amount of data is written in a sequential manner to a magnetic tape storage device or to an optical storage device. While this caching technique is effective in utilizing some of the properties of the multiple storage media types (e.g., fast writes to rotating disk, long-term retention on magnetic or optical media), the caching technique detrimentally involves maintaining multiple copies of large amounts of data, which can rapidly consume valuable storage system resources.
Another conventional approach for facilitating use of multiple storage media types in a coherent fashion involves technology called “Information Life Cycle Management” (ILM). In this approach, data is initially stored on a first storage medium of a type usually selected for its performance characteristics. Then, at some later point in time a software component is activated to transfer data from the first storage medium to some second storage medium, wherein the second storage medium is usually selected based on its lower cost. The ILM software component moves the data from one location to another and typically deletes the initial copy. As a result, the ILM approach differs from the caching approach in that there is only one active copy of the data at any time. However, the ILM approach is not optimal with regard to a number of considerations.
For example, in unsophisticated ILM implementations, a user is responsible for understanding that data has been moved between storage devices. Therefore, when subsequent access to the data needs to be made, the user must know to retrieve the data from the secondary storage medium to which it was copied, rather than from the storage medium on which is was initially stored. In more advanced ILM implementations, the ILM software component is defined to leave behind some indication (sometimes called a “stub”) which indicates that the data has been moved and the location where the data has been moved. Then, at a subsequent time when the user attempts to retrieve the data, the ILM software component intervenes and retrieves the data from its secondary location based on the information in the stub. It should be understood, however, that implementation of an advanced ILM system such as that described above often requires extremely complex and expensive software. Additionally, ILM systems are usually applied at high levels in the operating system stack, thereby manipulating entire files at one time, as opposed to individual data blocks, thereby reducing storage system efficiency and operating system independence relative to the storage system.